package org.essilab.analyzer.util;

public class Normalizer {

    private static final char[] filtred = {':', '^', '&', '{', '}', '(', ')', '[', ']', '\'', '’', '\"', '\\', '/', '<', '>', '?', '|', '*', '§', '!', '%', 'µ', '$', '#', 'ø', '²', '~', '£', '='};
    private static final String PLAIN_ASCII =
            "AaEeIiOoUu" // grave
            + "AaEeIiOoUuYy" // acute
            + "AaEeIiOoUuYy" // circumflex
            + "AaOoNn" // tilde
            + "AaEeIiOoUuYy" // umlaut
            + "Aa" // ring
            + "Cc" // cedilla
            + "OoUu";         // double acute
    private static final String UNICODE =
            "\u00C0\u00E0\u00C8\u00E8\u00CC\u00EC\u00D2\u00F2\u00D9\u00F9"
            + "\u00C1\u00E1\u00C9\u00E9\u00CD\u00ED\u00D3\u00F3\u00DA\u00FA\u00DD\u00FD"
            + "\u00C2\u00E2\u00CA\u00EA\u00CE\u00EE\u00D4\u00F4\u00DB\u00FB\u0176\u0177"
            + "\u00C3\u00E3\u00D5\u00F5\u00D1\u00F1"
            + "\u00C4\u00E4\u00CB\u00EB\u00CF\u00EF\u00D6\u00F6\u00DC\u00FC\u0178\u00FF"
            + "\u00C5\u00E5"
            + "\u00C7\u00E7"
            + "\u0150\u0151\u0170\u0171";

    /**
     * Replace special characters in a string by its characters ascii
     *
     * @param input
     * @return
     */
    private static String convert(String input) {
        if (input == null) {
            return null;
        }
        StringBuilder sb = new StringBuilder();
        int n = input.length();
        for (int i = 0; i < n; i++) {
            char c = input.charAt(i);
            int pos = UNICODE.indexOf(c);
            if (pos > -1) {
                sb.append(PLAIN_ASCII.charAt(pos));
            } else {
                sb.append(c);
            }
        }
        return sb.toString();
    }

    /**
     *
     * @param c
     * @return
     */
    private static boolean exist(char c) {
        for (int i = 0; i < filtred.length; i++) {
            if (filtred[i] == c) {
                return true;
            }
        }
        return false;
    }

    /**
     *
     * @param input
     * @return
     */
    private static String filtred(String input) {
        if (input == null) {
            return null;
        }
        StringBuilder sb = new StringBuilder();
        int n = input.length();
        for (int i = 0; i < n; i++) {
            char c = input.charAt(i);
            if (exist(c)) {
                sb.append(" ");
            } else {
                sb.append(c);
            }
        }
        return sb.toString();
    }

    /**
     *
     * @param input
     * @param separator
     * @return
     */
    public static String normalizer(String input, String separator) {
        input = filtred(input);
        input = convert(input).trim().replaceAll("[,;]", " ");
        input = input.replaceAll("[\\s]{2,}", " ");
        return input.replaceAll("[\\s]", separator).trim();
    }

    /**
     * Normalizer string
     *
     * @param input
     * @return
     */
    public static String normalizer(String input) {
        return normalizer(input, "_");
    }
}
